﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BLLMagiPack.Managers;
using ModeloMagiPack.Entidades;

namespace MaGiPack.Movimientos
{
    public partial class FrmMovimientos : Form
    {
        #region Inicializacion

        private bool _esBanco;

        public FrmMovimientos(bool esBanco)
        {
            InitializeComponent();
            txtSaldoPositivoTotal.KeyPress += Utilidades.BloquearTextbox;
            txtSaldoNegativoTotal.KeyPress += Utilidades.BloquearTextbox;
            _esBanco = esBanco;
        }

        private void CargarFiltros()
        {
            for (int i = DateTime.Today.Year; i >= (DateTime.Today.Year - 50); i--)
                cboAños.Items.Add(i.ToString());

            foreach (string mes in Enum.GetNames(typeof(Meses)))
                cboMeses.Items.Add(mes);

            cboAños.SelectedIndex = cboMeses.SelectedIndex = 0;

            if (_esBanco)
            {
                lblCuenta.Visible = cboCuentasBancarias.Visible = true;
                bsCuentasBancarias.DataSource = new BLLCuentaBancaria().TraerCuentas();
            }
            else
                lblCuenta.Visible = cboCuentasBancarias.Visible = false;
        }

        private void FrmMovimientos_Load(object sender, EventArgs e)
        {
            CargarFiltros();

            if (_esBanco)
            {
                Text = "Movimientos de BANCO";
                picLogo.Image = Properties.Resources.Bank;
            }
            else
            {
                Text = "Movimientos de CAJA";
                picLogo.Image = Properties.Resources.Cash;
            }
        }

        #endregion

        #region CRUD Grilla
        private DateTime? _buscarDesde;
        private DateTime? _buscarHasta;
        private int? _idCuentaBancaria;

        private void BuscarMovimientos()
        {
            _buscarDesde = new DateTime(int.Parse(cboAños.Text), cboMeses.SelectedIndex + 1, 1);
            _buscarHasta = _buscarDesde.Value.AddMonths(1).Subtract(new TimeSpan(1, 0, 0, 0, 0));

            if (_esBanco)
                _idCuentaBancaria = (int) cboCuentasBancarias.SelectedValue;

            cboAños.Enabled = cboMeses.Enabled = btnBuscarMovimientos.Enabled = btnCalcularSaldos.Enabled = false;
            picCargandoMovimientos.Visible = true;
            btnBuscarMovimientos.Text = "Buscando...";

            bgwBuscandoMovimientos.RunWorkerAsync();
        }


        private void btnBuscarMovimientos_Click(object sender, EventArgs e)
        {
            BuscarMovimientos();
        }

        private void bgwBuscandoMovimientos_DoWork(object sender, DoWorkEventArgs e)
        {
            List<Movimiento> movimientos = new BLLMovimiento().TraerMovimientos(_buscarDesde, _buscarHasta, _idCuentaBancaria);
            e.Result = movimientos;
        }

        private void bgwBuscandoMovimientos_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            cboAños.Enabled = cboMeses.Enabled = btnBuscarMovimientos.Enabled = btnCalcularSaldos.Enabled = true;
            picCargandoMovimientos.Visible = false;
            btnBuscarMovimientos.Text = "Buscar movimientos";

            List<Movimiento> movimientos = e.Result as List<Movimiento>;
            dgvMovimientos.Columns["ClmBanco"].Visible = _esBanco;
            dgvMovimientos.Rows.Clear();

            foreach (Movimiento movimiento in movimientos)
            {
                if (_esBanco)
                {
                    string nombreBanco = "Vacío";

                    CuentaBancariaMovimiento asignacion = new BLLCuentaBancariaMovimiento().TraerPorMovimiento(movimiento.IdMovimiento);

                    if (asignacion != null)
                    {
                        CuentaBancaria cuenta = new BLLCuentaBancaria().Traer(asignacion.IdCuentaBancaria);
                        Banco banco = new BLLBanco().TraerBanco(cuenta.IdBanco);
                        nombreBanco = cuenta.Nombre + " - " + banco.NombreBanco;
                    }
                    dgvMovimientos.Rows.Add(new object[] { movimiento.IdMovimiento, movimiento.Motivo, movimiento.Monto,
                                         new BLLCategoria().TraerCategoria(movimiento.IdCategoria).Nombre,nombreBanco, movimiento.Fecha.ToShortDateString()});
                }
                else
                    dgvMovimientos.Rows.Add(new object[] { movimiento.IdMovimiento, movimiento.Motivo, movimiento.Monto,
                                         new BLLCategoria().TraerCategoria(movimiento.IdCategoria).Nombre, movimiento.Fecha.ToShortDateString()});

                DataGridViewRow fila = dgvMovimientos.Rows[dgvMovimientos.Rows.Count - 1];

                if (movimiento.EsIngreso)
                    fila.Cells["ClmMonto"].Style.ForeColor = fila.Cells["ClmMonto"].Style.SelectionForeColor = Color.Green;
                else
                    fila.Cells["ClmMonto"].Style.ForeColor = fila.Cells["ClmMonto"].Style.SelectionForeColor = Color.Red;
            }
        }

        private void dgvMovimientos_SelectionChanged(object sender, EventArgs e)
        {
            btnEditar.Enabled = btnRemover.Enabled = dgvMovimientos.SelectedRows.Count > 0;
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            FrmMovimiento frmNuevoMovimiento = new FrmMovimiento(_esBanco);
            frmNuevoMovimiento.StartPosition = FormStartPosition.CenterScreen;
            frmNuevoMovimiento.ShowDialog();
            BuscarMovimientos();
        }

        private void btnRemover_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Eliminar movimiento/s seleccionado/s?", "PREGUNTA", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                BLLMovimiento bllMovimiento = new BLLMovimiento();

                foreach (DataGridViewRow fila in dgvMovimientos.SelectedRows)
                {
                    int idMovimiento = (int) fila.Cells["ClmIdMovimiento"].Value;
                    bllMovimiento.EliminarMovimiento(idMovimiento);
                }

                BuscarMovimientos();
            }
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            int idMovimiento = (int)dgvMovimientos.SelectedRows[0].Cells["ClmIdMovimiento"].Value;
            BLLMovimiento bll = new BLLMovimiento();
            Movimiento movimiento = bll.TraerMovimiento(idMovimiento);
            FrmMovimiento frmMovimiento = new FrmMovimiento(movimiento);
            frmMovimiento.StartPosition = FormStartPosition.CenterScreen;
            frmMovimiento.ShowDialog();
            BuscarMovimientos();
        }

        #endregion

        #region Cálculo saldo

        private decimal _saldoPositivoTotal;
        private decimal _saldoNegativoTotal;
        private decimal _saldoPositivoMes;
        private decimal _saldoNegativoMes;
        private int _añoFiltro;
        private int _mesFiltro;

        private void btnCalcularSaldos_Click(object sender, EventArgs e)
        {
            cboAños.Enabled = cboMeses.Enabled = btnBuscarMovimientos.Enabled = btnCalcularSaldos.Enabled = false;
            picCalculandoSaldoMes.Visible = picCalculandoSaldoTotal.Visible = true;
            btnCalcularSaldos.Text = "Calculando...";

            _añoFiltro = int.Parse(cboAños.Text);
            _mesFiltro = cboMeses.SelectedIndex + 1;
            if (_esBanco)
                _idCuentaBancaria = (int)cboCuentasBancarias.SelectedValue;

            bgwCalcularSaldos.RunWorkerAsync();
        }

        private void bgwCalcularSaldos_DoWork(object sender, DoWorkEventArgs e)
        {
            BLLMovimiento bll = new BLLMovimiento();
            _saldoPositivoTotal = _saldoNegativoTotal = _saldoPositivoMes = _saldoNegativoMes = 0;

            bll.CalcularSaldos(out _saldoPositivoTotal, out _saldoNegativoTotal, _idCuentaBancaria, _añoFiltro, _mesFiltro, true);
            bll.CalcularSaldos(out _saldoPositivoMes, out _saldoNegativoMes, _idCuentaBancaria, _añoFiltro, _mesFiltro, false);
        }

        private void bgwCalcularSaldos_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            cboAños.Enabled = cboMeses.Enabled = btnBuscarMovimientos.Enabled = btnCalcularSaldos.Enabled = true;
            picCalculandoSaldoMes.Visible = picCalculandoSaldoTotal.Visible = false;
            btnCalcularSaldos.Text = "Calcular Saldos";

            txtSaldoNegativoTotal.Text = _saldoNegativoTotal.ToString("C2", Utilidades.Cultura);
            txtSaldoPositivoTotal.Text = _saldoPositivoTotal.ToString("C2", Utilidades.Cultura);
            txtTotalTotal.Text = (_saldoPositivoTotal - _saldoNegativoTotal).ToString("C2", Utilidades.Cultura);

            txtSaldoNegativoMes.Text = _saldoNegativoMes.ToString("C2", Utilidades.Cultura);
            txtSaldoPositivoMes.Text = _saldoPositivoMes.ToString("C2", Utilidades.Cultura);
            txtTotalMes.Text = (_saldoPositivoMes - _saldoNegativoMes).ToString("C2", Utilidades.Cultura);
        }

        #endregion
    }
}
